package com.example.offer;

/**
 * 剑指 Offer 16. 数值的整数次方
 * 实现 pow(x, n) ，即计算 x 的 n 次幂函数（即，x的n次方）。不得使用库函数，同时不需要考虑大数问题。
 * 示例 1：
 * <p>
 * 输入：x = 2.00000, n = 10
 * 输出：1024.00000
 * 示例 2：
 * <p>
 * 输入：x = 2.10000, n = 3
 * 输出：9.26100
 * 示例 3：
 * <p>
 * 输入：x = 2.00000, n = -2
 * 输出：0.25000
 * 解释：2-2 = 1/22 = 1/4 = 0.25
 * <p>
 * 思路：快速幂
 * x的n次方=x的(n/2)*x的(n/2)=x平方的（n/2）次方
 * 所以任何关于x的n次方都可转化为x的平方来快速求解
 * <p>
 * 当n为奇数时  x的n次方=x*x平方的（n/2）次方  因为n/2向下取整，所以多乘一位x
 * 当n为偶数时，x的n次方=x平方的（n/2）次方
 */
public class MyPow {
    public static double myPow(double x, int n) {
        if (x == 0) return 0;
        long b = n;
        double res = 1.0;
        if (b < 0) {
            x = 1 / x;
            b = -b;
        }
        while (b > 0) {
            if ((b % 2) != 0) res *= x; //if ((b & 1) == 1) res *= x;
            x *= x;
            b /= 2; //b >>= 1;
        }
        return res;
    }

    public static void main(String[] args) {
        System.out.println(MyPow.myPow(2.0, 10));
    }
}
